package com.xxxtea.common;

import com.xxxtea.entity.User;
import lombok.experimental.UtilityClass;

/**
 * 用户上下文工具类
 * 
 * 基于ThreadLocal实现的用户信息上下文，便于在多线程环境下安全地获取和设置当前用户信息。
 * 主要用于用户身份、权限、会话等场景。
 * 
 * @author badman
 * @since 1.0.0
 */
@UtilityClass
public class UserContext {
	/** 当前线程的用户信息 */
	private final ThreadLocal<User> threadLocal = new InheritableThreadLocal<>();

	/**
	 * 获取当前用户ID
	 * @return 用户ID，若无则返回null
	 */
	public Integer getId() {
		User user = threadLocal.get();
		if (user == null) {
			return null;
		}
		return user.getId();
	}

	/**
	 * 获取当前用户角色
	 * @return 用户角色，未登录返回null
	 */
	public User.Role getRole() {
		return isLogin() ? getUser().getRole() : null;
	}

	/**
	 * 判断当前是否已登录
	 * @return true=已登录，false=未登录
	 */
	public boolean isLogin() {
		return getUser() != null;
	}

	/**
	 * 获取当前用户对象
	 * @return 用户对象
	 */
	public User getUser() {
		return threadLocal.get();
	}

	/**
	 * 设置当前线程的用户对象
	 * @param user 用户对象
	 */
	public void setUser(User user) {
		threadLocal.set(user);
	}

	/**
	 * 移除当前线程的用户信息，防止内存泄漏
	 */
	public void remove() {
		threadLocal.remove();
	}
}